//package com.andy.util.pb;
//
//import java.util.concurrent.ConcurrentHashMap;
//
//import javax.xml.validation.Schema;
//
//import io.protostuff.CollectionSchema;
//import io.protostuff.LinkedBuffer;
//import io.protostuff.MessageCollectionSchema;
//import io.protostuff.ProtostuffIOUtil;
//import io.protostuff.runtime.RuntimeSchema;
//
//public class PBUtil {
//
//	static final ThreadLocal<LinkedBuffer> linkBuffer = new ThreadLocal<LinkedBuffer>() {
//
//		protected LinkedBuffer initialValue() {
//			return LinkedBuffer.allocate( BUF_SIZE );
//		};
//	};
//
//	static final int BUF_SIZE = 256;
//
//	static final ConcurrentHashMap<String, CollectionSchema<?>> pojoMapping = new ConcurrentHashMap<>();
//
//	/**
//	 * 获取VO对象的scheme，这个scheme本身缓存的在JVM内存的，不会重复生成
//	 * @param clazz
//	 * @return
//	 */
//	public static <T> Schema<T> getRuntimeSchema( Class<T> clazz ) {
//		return RuntimeSchema.getSchema( clazz );
//	}
//
//	/**
//	 * 把任何对象转换成pb格式
//	 * 不要再把这个byte[]转换成String了，防止因为各个字符集字节数的差异导致报错
//	 * @param message
//	 * @param schema
//	 * @return
//	 */
//	public static <T> byte[] toByteArray( T message, Schema<T> schema ) {
//		return ProtostuffIOUtil.toByteArray( message, schema, buf() );
//	}
//
//	/**
//	 * 性能上会比上面的好点，同一线程使用同一个linkedBuffer
//	 * 
//	 * @param message
//	 * @param cls
//	 * @return
//	 */
//	public static <T> byte[] toByteArray( T message, Class<T> cls ) {
//		LinkedBuffer buffer = linkBuffer.get();
//		try {
//			return ProtostuffIOUtil.toByteArray( message,
//					getRuntimeSchema( cls ), buffer );
//		} finally {
//			buffer.clear();
//		}
//	}
//
//	public static LinkedBuffer buf() {
//		return LinkedBuffer.allocate( BUF_SIZE );
//	}
//
//	/**
//	 * 把protobuf的数据转换设置到message对应的属性中
//	 * @param bytes
//	 * @param message
//	 * @param schema
//	 */
//	public static <T> void mergeFrom( byte[] bytes, T message, Schema<T> schema ) {
//		ProtostuffIOUtil.mergeFrom( bytes, message, schema );
//	}
//
//	public static <T> void mergeFrom( byte[] bytes, T message, Class<T> cls ) {
//		ProtostuffIOUtil.mergeFrom( bytes, message, getRuntimeSchema( cls ) );
//	}
//
//	/**
//	 * 获取集合类型的schema
//	 * @param clazz
//	 * @return
//	 */
//	@SuppressWarnings("unchecked")
//	public static <T> CollectionSchema<T> geCollectionSchema( Class<T> clazz ) {
//		String name = clazz.getName();
//		CollectionSchema<T> hs = ( CollectionSchema<T> )pojoMapping.get( name );
//		if( hs == null ) {
//			CollectionSchema<T> collectionSchema = new MessageCollectionSchema<T>( getRuntimeSchema( clazz ) );
//			pojoMapping.putIfAbsent( name, collectionSchema );
//			return collectionSchema;
//		}
//		return hs;
//	}
//}
